const axios = require('axios');

// 根据水滴聚合文档的回调格式进行测试
const CALLBACK_DOMAIN = '13be2816e0e8.ngrok-free.app';

// 模拟回调测试数据
const testCases = [
  {
    name: 'QQ登录回调测试',
    type: 'qq',
    code: '520DD95263C1CFEA0870FBB66E12345', // 模拟的authorization code
    description: '模拟QQ登录成功后的回调'
  },
  {
    name: '微信登录回调测试', 
    type: 'wx',
    code: 'AB123456789CDEF0870FBB66E54321',
    description: '模拟微信登录成功后的回调'
  }
];

async function testCallback(testCase) {
  console.log(`\n🧪 ${testCase.name}`);
  console.log(`📝 ${testCase.description}`);
  
  // 构建回调URL，按照水滴聚合文档的格式
  const callbackUrl = `http://${CALLBACK_DOMAIN}/lxt/shuidi-callback?type=${testCase.type}&code=${testCase.code}`;
  
  console.log('🔗 回调URL:', callbackUrl);
  console.log('📋 参数解析:');
  console.log(`   └─ type: ${testCase.type}`);
  console.log(`   └─ code: ${testCase.code}`);
  
  try {
    const response = await axios.get(callbackUrl, {
      timeout: 30000,
      maxRedirects: 0, // 不自动跟随重定向，我们要看重定向的目标
      validateStatus: function (status) {
        // 接受重定向状态码
        return status >= 200 && status < 400;
      },
      headers: {
        'ngrok-skip-browser-warning': 'true',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
      }
    });
    
    console.log('✅ 回调处理成功');
    console.log('📊 响应状态:', response.status);
    
    if (response.status >= 300 && response.status < 400) {
      const redirectLocation = response.headers.location;
      console.log('🔄 重定向到:', redirectLocation);
      
      // 分析重定向URL
      if (redirectLocation) {
        const url = new URL(redirectLocation);
        console.log('📍 重定向分析:');
        console.log(`   └─ 域名: ${url.hostname}`);
        console.log(`   └─ 路径: ${url.pathname}`);
        console.log(`   └─ 参数: ${url.search}`);
        
        // 检查重定向是否指向正确的前端页面
        if (redirectLocation.includes('/login-success') || 
            redirectLocation.includes('/register-success')) {
          console.log('🎉 重定向到成功页面！');
        } else if (redirectLocation.includes('/login-error')) {
          console.log('⚠️ 重定向到错误页面');
        }
      }
    }
    
  } catch (error) {
    if (error.response && error.response.status >= 300 && error.response.status < 400) {
      // 这是重定向，不是错误
      const redirectLocation = error.response.headers.location;
      console.log('🔄 重定向到:', redirectLocation);
    } else {
      console.log('❌ 回调测试失败');
      console.log('错误:', error.message);
      
      if (error.code === 'ENOTFOUND') {
        console.log('💡 建议: 检查ngrok隧道是否正在运行');
      } else if (error.code === 'ECONNREFUSED') {
        console.log('💡 建议: 检查后端服务器是否在运行');
      }
    }
  }
}

async function testCallbackFormat() {
  console.log('=== 水滴聚合回调格式测试 ===\n');
  
  console.log('📖 根据水滴聚合文档:');
  console.log('第三方登录成功会自动跳转到指定的redirect_uri，并跟上Authorization Code');
  console.log('例如回调地址是：www.qq.com/my.php，则会跳转到：');
  console.log('http://www.qq.com/my.php?type=qq&code=520DD95263C1CFEA0870FBB66E**\n');
  
  console.log('🎯 我们的回调配置:');
  console.log(`回调地址: http://${CALLBACK_DOMAIN}/lxt/shuidi-callback`);
  console.log('预期格式: http://域名/lxt/shuidi-callback?type=登录方式&code=授权码\n');
  
  // 测试各种回调场景
  for (const testCase of testCases) {
    await testCallback(testCase);
    await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒
  }
}

// 测试空参数的情况
async function testEmptyParams() {
  console.log('\n🧪 异常情况测试');
  console.log('📝 测试缺少参数的回调处理');
  
  const emptyTestCases = [
    {
      name: '缺少code参数',
      url: `http://${CALLBACK_DOMAIN}/lxt/shuidi-callback?type=qq`,
      expected: '应该重定向到错误页面'
    },
    {
      name: '缺少type参数', 
      url: `http://${CALLBACK_DOMAIN}/lxt/shuidi-callback?code=123456`,
      expected: '应该能正常处理，type参数是可选的'
    },
    {
      name: '完全没有参数',
      url: `http://${CALLBACK_DOMAIN}/lxt/shuidi-callback`,
      expected: '应该重定向到错误页面'
    }
  ];
  
  for (const test of emptyTestCases) {
    console.log(`\n🔍 ${test.name}`);
    console.log(`🔗 URL: ${test.url}`);
    console.log(`📋 预期: ${test.expected}`);
    
    try {
      const response = await axios.get(test.url, {
        timeout: 10000,
        maxRedirects: 0,
        validateStatus: function (status) {
          return status >= 200 && status < 400;
        },
        headers: {
          'ngrok-skip-browser-warning': 'true',
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
      });
      
      if (response.status >= 300) {
        const redirectLocation = response.headers.location;
        console.log('🔄 重定向到:', redirectLocation);
        
        if (redirectLocation && redirectLocation.includes('/login-error')) {
          console.log('✅ 正确处理：重定向到错误页面');
        } else {
          console.log('⚠️ 未按预期处理');
        }
      }
      
    } catch (error) {
      if (error.response && error.response.status >= 300) {
        const redirectLocation = error.response.headers.location;
        console.log('🔄 重定向到:', redirectLocation);
      } else {
        console.log('❌ 测试失败:', error.message);
      }
    }
  }
}

async function main() {
  console.log('=== 水滴聚合回调测试工具 ===\n');
  
  // 测试正常回调流程
  await testCallbackFormat();
  
  // 测试异常情况
  await testEmptyParams();
  
  console.log('\n=== 测试完成 ===');
  console.log('💡 提示：');
  console.log('1. 如果看到重定向到成功页面，说明回调处理正常');
  console.log('2. 如果看到重定向到错误页面，检查水滴聚合API是否正常'); 
  console.log('3. 真实测试时，code参数将由水滴聚合平台提供');
}

// 导出测试函数，也可以直接运行
if (require.main === module) {
  main().catch(console.error);
}

module.exports = { testCallback, testCallbackFormat, testEmptyParams }; 